﻿#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
    int maxConsecutiveAnswers(string answerKey, int k) {
        int len = answerKey.size(), sum_t = 0, sum_f = 0;        //实时记录对应的t和f的总数
        int left_t = 0, left_f = 0, max_sum = 0;                 //遍历过程中t数列和f数列的左边界
        for (int i = 0; i < len; i++) {            //i可以理解为右边界
            if (answerKey[i] == 'F')
                sum_f++;
            else sum_t++;
            //把T理解为主数列，那么F就是冗余项，需要判断实时的数量，不能超过k
            //如果超过了，就要左边界向右移动，直到F的数量恢复正常标准
            while (sum_f > k) {
                if (answerKey[left_t] == 'F')
                    sum_f--;
                left_t++;
            }
            //同理，把F理解为主数列，那么T就是冗余项
            while (sum_t > k) {
                if (answerKey[left_f] == 'T')
                    sum_t--;
                left_f++;
            }
            //比较取最大值
            max_sum = max(max_sum, max(i - left_t, i - left_f) + 1);
        }
        return max_sum;
    }
};
void test01(string& answerKey, int k)
{
    Solution s;
    cout << s.maxConsecutiveAnswers(answerKey, k) << endl;
}
int main()
{
    string answerKey = "TFFT";
    test01(answerKey,1);
}
//一位老师正在出一场由 n 道判断题构成的考试，每道题的答案为 true （用 'T' 表示）或者 false （用 'F' 表示）。老师想增加学生对自己做出答案的不确定性，方法是 最大化 有 连续相同 结果的题数。（也就是连续出现 true 或者连续出现 false）。
//
//给你一个字符串 answerKey ，其中 answerKey[i] 是第 i 个问题的正确结果。除此以外，还给你一个整数 k ，表示你能进行以下操作的最多次数：
//
//每次操作中，将问题的正确答案改为 'T' 或者 'F' （也就是将 answerKey[i] 改为 'T' 或者 'F' ）。
//请你返回在不超过 k 次操作的情况下，最大 连续 'T' 或者 'F' 的数目。
//
//
//
//示例 1：
//
//输入：answerKey = "TTFF", k = 2
//输出：4
//解释：我们可以将两个 'F' 都变为 'T' ，得到 answerKey = "TTTT" 。
//总共有四个连续的 'T' 。
//示例 2：
//
//输入：answerKey = "TFFT", k = 1
//输出：3
//解释：我们可以将最前面的 'T' 换成 'F' ，得到 answerKey = "FFFT" 。
//或者，我们可以将第二个 'T' 换成 'F' ，得到 answerKey = "TFFF" 。
//两种情况下，都有三个连续的 'F' 。
//示例 3：
//
//输入：answerKey = "TTFTTFTT", k = 1
//输出：5
//解释：我们可以将第一个 'F' 换成 'T' ，得到 answerKey = "TTTTTFTT" 。
//或者我们可以将第二个 'F' 换成 'T' ，得到 answerKey = "TTFTTTTT" 。
//两种情况下，都有五个连续的 'T' 。
//\